-- 图灵识别字库脚本
-- 功能：提供基于图灵算法的文字识别功能，支持连通区域识别
-- 作者：系统
-- 版本：1.0

-- 加载图灵识别模块
local TURING = require("TURING")
local M = {}
-- 文字识别库函数
-- 功能：定义需要识别的文字模板库
-- 返回：包含六十四进制编码的字库数组
function 文字识别库()
    local 识别库 = {}
    -- 苹果账号密码界面的确认按钮模板
    -- 格式：文字名称|尺寸|六十四进制编码
    识别库[1]="苹果账号密码界面确认按钮|44,36|00&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&0000&&00&&&&&&&&&&&&V&&&&#F&&&&y7&&&&u3&&&&m3&&&&W1&&&&00&&&&00V&&#00F&&y007&&u003&&m001&&W001&&0000&&0000V#0000Fy00007u00003m00"
    识别库[2]="收起输入法按钮|36,18|W00G008004002001000W00G008004002001000W00G00800400200100100200400800G00W0100200400800G00W0100200400800G00W00"
    识别库[3]="苹果账号继续登陆按钮|92,43|0008000000F0F0u00VW70S00VmFWE00&uFmE01#OFu703yCFu3WFu6VS1m&m3UE0mVW3#70u701#3WS201y1WE003y1m6007u0u7003m0S3W00m0C1m000000000000000&&&&&&uV&&&&&yF&&&&&#00000070000003W00u081m80S0F0uFWE0F0S3#70F0E0FZWV0700nmU03W00uy01m00Tu00u00Fu00S&&&&&&EV&&&&&dF&&&&&pW00xW01m00Sy00u06EF00S0F73m0E0&3WU071#1m7W3WO0u1u1m00S0O0u00E000S000000000000000000000000000000000000007060u00FW70S00Fm7WS00Vm7mE00#OFm701#CFu703yEVS3W7u7UE1WVm3#E1mFW1y70u301y3WO003u1WS007u1mE003m0uE000W00000000000G0000S0C0708E0E03WC7073Xm73W71mu1nm7WuSOSu3WSECES3mE773E3m73Xm73m3XmS3Zm1muE1tmF&y00&m7&#01&m3&&F&&W1&&d&&003Xp&pY01mu01pW0uS00uu0SE00SS0E700E7073W071m3Xmm3WS1m&u1mF0uVy0u3m0Fm0S0y0300E0E0000002"
 	return 识别库
end

-- 图文识别_连通区域函数
-- 功能：在指定屏幕区域内识别文字，使用连通区域算法
-- 参数说明：
--   screen_x1, screen_y1: 屏幕识别区域的左上角坐标
--   screen_x2, screen_y2: 屏幕识别区域的右下角坐标
--   binary_text: 二值化文本，用于图像预处理
--   crop_x1, crop_y1: 裁剪区域的左上角坐标
--   crop_x2, crop_y2: 裁剪区域的右下角坐标
-- 返回：识别到的文字字符串，失败时返回nil
function M.图文识别并点击_连通区域(screen_x1, screen_y1, screen_x2, screen_y2, binary_text,识别文本)
	print("图文识别并点击_连通区域")
	local 识别结果, 识别字库
	
	-- 参数验证：检查屏幕范围参数是否有效
	if not screen_x1 or not screen_y1 or not screen_x2 or not screen_y2 then
		_ENV["调试输出"]("图文识别_连通区域: 屏幕范围参数错误", true)
		return nil
	end
	
	-- 参数验证：检查二值化文本参数是否有效
	print("binary_text",binary_text)
	if not binary_text then
		_ENV["调试输出"]("图文识别_连通区域: 二值化文本参数错误", true)
		return nil
	end
	
	TURING.来源_获取屏幕像素(screen_x1, screen_y1, screen_x2, screen_y2)    -- 仅备用！
	TURING.滤镜_彩色_二值化(binary_text)
    TURING.滤镜_黑白_颠倒颜色(2)
    TURING.切割_连通区域切割(true)    -- [VIP]
    TURING.字库_加载六十四进制识别字库(文字识别库())     -- [VIP]   
 	local 识别结果 = TURING.识别(85,2)
	if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
		print(识别结果)
		
		-- 分离识别结果中的坐标信息
		-- 格式：文字,坐标X,坐标Y
		local parts = {}
		for part in string.gmatch(识别结果, "[^,]+") do
			table.insert(parts, part)
		end
	

		if #parts >= 3 then
			local 按钮文字 = parts[1]
			local 坐标X = tonumber(parts[2]) +71
			local 坐标Y = tonumber(parts[3])+290
			
			print(按钮文字,识别文本)
			if 按钮文字 ~= 识别文本 then
				return nil
			end
			if 坐标X and 坐标Y then
				_ENV["调试输出"]("分离坐标成功: " .. 按钮文字 .. " X:" .. 坐标X .. " Y:" .. 坐标Y, true)
				-- 返回分离后的坐标信息
				tap(坐标X, 坐标Y)
				return 坐标X, 坐标Y
			else
				_ENV["调试输出"]("坐标解析失败: " .. tostring(识别结果), true)
				return nil
			end
		else
			_ENV["调试输出"]("识别结果格式错误: " .. tostring(识别结果), true)
			return nil
		end
	end
end

function M.图文识别并点击_范围投影(screen_x1, screen_y1, screen_x2, screen_y2, 切割范围X,切割范围Y,binary_text,识别文本,tapx,tapy)
	print("图文识别并点击_连通区域")
	local 识别结果, 识别字库
	
	-- 参数验证：检查屏幕范围参数是否有效
	if not screen_x1 or not screen_y1 or not screen_x2 or not screen_y2 then
		_ENV["调试输出"]("图文识别_连通区域: 屏幕范围参数错误", true)
		return nil
	end
	
	-- 参数验证：检查二值化文本参数是否有效
	print("binary_text",binary_text)
	if not binary_text then
		_ENV["调试输出"]("图文识别_连通区域: 二值化文本参数错误", true)
		return nil
	end
	
	TURING.来源_获取屏幕像素(screen_x1, screen_y1, screen_x2, screen_y2)    -- 仅备用！
	TURING.滤镜_彩色_二值化(binary_text)
    TURING.切割_范围投影切割(切割范围X,切割范围Y)  -- [VIP]
    TURING.字库_加载六十四进制识别字库(文字识别库())     -- [VIP]   
 	local 识别结果 = TURING.识别(85,2)
	if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
		print(识别结果)
		
		-- 分离识别结果中的坐标信息
		-- 格式：文字,坐标X,坐标Y
		local parts = {}
		for part in string.gmatch(识别结果, "[^,]+") do
			table.insert(parts, part)
		end
	

		if #parts >= 3 then
			local 按钮文字 = parts[1]
			local 坐标X = tonumber(parts[2]) +71
			local 坐标Y = tonumber(parts[3])+290
			
			print(按钮文字,识别文本)
			if 按钮文字 ~= 识别文本 then
				return false
			end
			if 坐标X and 坐标Y then
				_ENV["调试输出"]("分离坐标成功: " .. 按钮文字 .. " X:" .. 坐标X .. " Y:" .. 坐标Y, true)
				-- 返回分离后的坐标信息
				tap(tapx, tapy)
				return true
			else
				_ENV["调试输出"]("坐标解析失败: " .. tostring(识别结果), true)
				return false
			end
		else
			_ENV["调试输出"]("识别结果格式错误: " .. tostring(识别结果), true)
			return false
		end
	end
end

function M.循环识图并点击_范围投影(x1,y1,x2,y2,切割范围X,切割范围Y,binary_text,识别文本,tapx,tapy)
	for i = 1 , 20 do
		local 是否识别到 = M.图文识别并点击_范围投影(x1,y1,x2,y2,切割范围X,切割范围Y,binary_text,识别文本,tapx,tapy)	
		if 是否识别到 then
			break
		end
		sleep(100)
	end
end

return M
